import { TabTypeEnum, TASK_EVAL_INDEX, TASK_MODE } from "@/constants/other-keys"

export type TaskProcessFileType = "model" | "sample"

export interface PageTableRequestData {
  /** 当前页码 */
  current_page: number
  /** 查询条数 */
  size?: number
  /** 任务类型 */
  task_type: TabTypeEnum
  /** 任务模式 */
  task_mode: TASK_MODE | undefined
  /** 任务状态 */
  task_status?: number
  /** 任务名称 */
  task_name?: string
  /** 发布时间 */
  publish_time?: string
  /** 截至时间 */
  end_time?: string
}

export interface TaskBaseInfo {
  task_id: string | undefined
  /** 任务名称 */
  task_name: string
  /** 任务描述 */
  task_describe?: string
  /** 任务进度 */
  task_process?: number
  /** 任务状态 */
  task_status: number
  /** 场景id */
  game_id?: string
  /** 任务类型 */
  task_type: TabTypeEnum
  /** 博弈配置 / 源数据资源 */
  associate_id?: string
  /** 任务算法标签 */
  task_tag?: string
  /** 评估指标 */
  task_eval_tag?: TASK_EVAL_INDEX[] | string
}

export interface CreateOrUpdateTaskData extends TaskBaseInfo {
  /** task_param */
  task_param: {
    task_config: TaskConfig
    episode_config: EpisodeConfig
    test_config: TestConfig
    save_config: SaveConfig
  }
}

export interface CreateOrUpdateTaskRequestData extends TaskBaseInfo {
  task_eval_tag?: string
  /** task_param */
  task_param: string
}

// 任务基本信息
export interface TaskConfig {
  /** 任务模式 */
  mode: TASK_MODE
  resources: {
    // 是否开启分布式
    distributed_enable: boolean
    // CPU数
    cpu_num: number | undefined
    // GPU数
    gpu_num: number | undefined
    // woker（节点）数
    worker_num: number | undefined
  }
}
// 训练配置
export interface EpisodeConfig {
  // 最大轮数
  max_episode: number | undefined
}
// 测试参数
export interface TestConfig {
  // 测试间隔
  test_interval: number | undefined
  // 测试数量
  test_num: number | undefined
}
// 保存配置
export interface SaveConfig {
  // 训练样本数据
  training_sample_data: {
    // 保存开关
    save_enable: boolean
    // 保存路径
    save_path: string | undefined
  }
  // 决策模型
  decision_model: {
    // 保存开关
    save_enable: boolean
    // 保存路径
    save_path: string | undefined
  }
  // 胜率
  win_rate: {
    // 保存开关
    save_enable: boolean
    // 保存路径
    save_path: string | undefined
  }
}

export interface TableRequestData {
  /** 任务类型 */
  task_type: TabTypeEnum
  /** 任务状态 */
  task_status?: number
  /** 任务名称 */
  task_name?: string
  /** 发布时间 */
  publish_time?: string
  /** 截至时间 */
  end_time?: string
}

export interface TableData extends TaskBaseInfo, CreateOrUpdateTaskRequestData {
  task_id: string
  task_status: number
  task_process: number
  task_eval_tag: string
  create_user: {
    user_id: string
    user_name: string
    user_position: string
  }
  create_time: string
}

export interface TaskProcessResData {
  round: number
  process_eva: string
  create_time: Date
}

export interface EvalProcessEvaData {
  // 综合能力
  comprehensive_ability: number
  // 感知能力
  perception: {
    // 侦察能力
    detective: number
    // 区域搜索能力
    regional_search: number
    // 综合能力
    ability: number
  }
  // 认知能力
  cognition: {
    // 自主性
    autonomy: number
    // 协同性
    cooperativity: number
    // 综合能力
    ability: number
  }
  // 决策能力
  decision: {
    // 火力支援
    fire_support: number
    // 博弈学习
    game_learning: number
    // 综合能力
    ability: number
  }
  // 行动能力
  action: {
    // 集群分组
    cluster_grouping: number
    // 协同性
    cooperativity: number
    // 综合能力
    ability: number
  }
}

export interface TrainProcessEvaData {
  reward: number
  win_rate: number
}

export type SearchTableResponseData = ApiResponseData<{
  total_pages: number
  total_count: number
  page_info: TableData[]
}>

export interface TaskProcessFileResData {
  // 文件id
  file_id: string
  // 文件名称
  file_name: string
  // 文件存储位置
  file_path: string
  // 任务过程文件描述
  describe: string
  // model:模型/sample:样本/situation:态势/command:指令;
  type: TaskProcessFileType
  // 文件标签
  tag: string
}
export type TaskInfoResponseData = ApiResponseData<CreateOrUpdateTaskRequestData>
export type TaskProcessDataResponseData = ApiResponseData<TaskProcessResData[]>
export type TaskProcessFileResponseData = ApiResponseData<TaskProcessFileResData[]>
export type TaskSaveResponseData = ApiResponseData<{ task_id: string }>
